/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */#include"CompositableHost.h"#include<map> // for _Rb_tree_iterator, map, etc#include<utility> // for pair#include"ContentHost.h" // for ContentHostDoubleBuffered, etc#include"Effects.h" // for EffectMask, Effect, etc#include"gfxUtils.h"#include"ImageHost.h" // for ImageHostBuffered, etc#include"TiledContentHost.h" // for TiledContentHost#include"mozilla/gfx/gfxVars.h"#include"mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor#include"mozilla/layers/TextureHost.h" // for TextureHost, etc#include"mozilla/layers/WebRenderImageHost.h"#include"mozilla/RefPtr.h" // for nsRefPtr#include"nsDebug.h" // for NS_WARNING#include"nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc#include"gfxPlatform.h" // for gfxPlatform#include"IPDLActor.h"namespacemozilla{usingnamespacegfx;namespacelayers{classCompositor;CompositableHost::CompositableHost(constTextureInfo&aTextureInfo):mTextureInfo(aTextureInfo),mCompositorBridgeID(0),mLayer(nullptr),mFlashCounter(0),mAttached(false),mKeepAttached(false){MOZ_COUNT_CTOR(CompositableHost);}CompositableHost::~CompositableHost(){MOZ_COUNT_DTOR(CompositableHost);}voidCompositableHost::UseTextureHost(constnsTArray<TimedTexture>&aTextures){if(mTextureSourceProvider){for(auto&texture:aTextures){texture.mTexture->SetTextureSourceProvider(mTextureSourceProvider);}}}voidCompositableHost::UseComponentAlphaTextures(TextureHost*aTextureOnBlack,TextureHost*aTextureOnWhite){MOZ_ASSERT(aTextureOnBlack&&aTextureOnWhite);if(mTextureSourceProvider){aTextureOnBlack->SetTextureSourceProvider(mTextureSourceProvider);aTextureOnWhite->SetTextureSourceProvider(mTextureSourceProvider);}}voidCompositableHost::RemoveTextureHost(TextureHost*aTexture){}voidCompositableHost::SetTextureSourceProvider(TextureSourceProvider*aProvider){MOZ_ASSERT(aProvider);mTextureSourceProvider=aProvider;}boolCompositableHost::AddMaskEffect(EffectChain&aEffects,constgfx::Matrix4x4&aTransform){CompositableTextureSourceRefsource;RefPtr<TextureHost>host=GetAsTextureHost();if(!host){NS_WARNING("Using compositable with no valid TextureHost as mask");returnfalse;}if(!host->Lock()){NS_WARNING("Failed to lock the mask texture");returnfalse;}if(!host->BindTextureSource(source)){NS_WARNING("The TextureHost was successfully locked but can't provide a TextureSource");host->Unlock();returnfalse;}MOZ_ASSERT(source);RefPtr<EffectMask>effect=newEffectMask(source,source->GetSize(),aTransform);aEffects.mSecondaryEffects[EffectTypes::MASK]=effect;returntrue;}voidCompositableHost::RemoveMaskEffect(){RefPtr<TextureHost>host=GetAsTextureHost();if(host){host->Unlock();}}/* static */already_AddRefed<CompositableHost>CompositableHost::Create(constTextureInfo&aTextureInfo){RefPtr<CompositableHost>result;switch(aTextureInfo.mCompositableType){caseCompositableType::IMAGE_BRIDGE:NS_ERROR("Cannot create an image bridge compositable this way");break;caseCompositableType::CONTENT_TILED:result=newTiledContentHost(aTextureInfo);break;caseCompositableType::IMAGE:if(gfxVars::UseWebRender()){result=newWebRenderImageHost(aTextureInfo);}else{result=newImageHost(aTextureInfo);}break;caseCompositableType::CONTENT_SINGLE:if(gfxVars::UseWebRender()){result=newWebRenderImageHost(aTextureInfo);}else{result=newContentHostSingleBuffered(aTextureInfo);}break;caseCompositableType::CONTENT_DOUBLE:MOZ_ASSERT(!gfxVars::UseWebRender());result=newContentHostDoubleBuffered(aTextureInfo);break;default:NS_ERROR("Unknown CompositableType");}returnresult.forget();}voidCompositableHost::DumpTextureHost(std::stringstream&aStream,TextureHost*aTexture){if(!aTexture){return;}RefPtr<gfx::DataSourceSurface>dSurf=aTexture->GetAsSurface();if(!dSurf){return;}aStream<<gfxUtils::GetAsDataURI(dSurf).get();}HostLayerManager*CompositableHost::GetLayerManager()const{if(!mLayer||!mLayer->Manager()){returnnullptr;}returnmLayer->Manager()->AsHostLayerManager();}TextureSourceProvider*CompositableHost::GetTextureSourceProvider()const{returnmTextureSourceProvider;}}// namespace layers}// namespace mozilla